package com.ly.algorithm.offerpointer;

import org.assertj.core.util.Lists;

import java.util.*;

/**
 * @Classname Offer39
 * @Description
 *
 * 数组中有一个数字出现的次数超过数组长度的一半，请找出这个数字。
 *
 *  
 *
 * 你可以假设数组是非空的，并且给定的数组总是存在多数元素。
 *
 *  
 *
 * 示例 1:
 *
 * 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
 * 输出: 2
 *
 * @Date 2021/1/30 16:07
 * @Author 冷心影翼
 */
public class Offer39 {

    public static void main(String[] args) {
        Solution39 solution39 = new Solution39();
        System.out.println(solution39.majorityElement(new int[]{3,2,3}));
    }
}


class Solution39 {
    public int majorityElement(int[] nums) {
        HashMap<Integer,Integer> hashMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            hashMap.put(nums[i],hashMap.getOrDefault(nums[i],0)+1);
            if(hashMap.get(nums[i])>=nums.length/2) {
                return nums[i];
            }
        }
        return 0;
    }

    public int majorityElementBest(int[] nums) {
//摩尔投票法，投我++，不投--，超过一半以上的人投我
        int count = 0, candidate = 0;
        for(int n : nums)
        {
            if(count == 0)
                candidate = n;
            if(n == candidate)
                count++;
            else
                count--;
        }
        return candidate;
    }

}